/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package ssp.topology;

import java.util.ArrayList;
import java.util.List;
import ssp.ResourceManager;
import ssp.SimulationManager;

/**
 * Edgeを管理するクラス
 * @author yamazaki
 */
public class EdgeManager implements ResourceManager {
    
    /**
     * シミュレーション中で唯一のクラスインスタンス
     */
    private final static EdgeManager INSTANCE = new EdgeManager();
    
    /**
     * シミュレーション中のEdgeのリスト
     */
    private List<Edge> edgeList;
    
    /**
     * コンストラクタ<br>
     * シングルトンのためprivateアクセス
     */
    private EdgeManager() {
        init();
        SimulationManager.register(this);
    }
    
    @Override
    public final void init() {
        this.edgeList = new ArrayList<>(300);
    }

    /**
     * @return the INSTANCE
     */
    public static EdgeManager getINSTANCE() {
        return INSTANCE;
    }
    

    /**
     * @return the edgeList
     */
    public List<Edge> getEdgeList() {
        return edgeList;
    }
    
    /**
     * 指定のindexのEdgeを返す
     * @param index index
     * @return Edge
     */
    public Edge getEdge(int index) {
        return this.edgeList.get(index);
    }
    
    /**
     * シミュレーション中のEdgeの数を返す
     * @return シミュレーション中のEdgeの数
     */
    public int getEdgeNum() {
        return this.edgeList.size();
    }
    
    /**
     * 指定のEdgeを管理に追加する
     * @param edge 追加するEdge
     */
    public void add(Edge edge) {
        this.edgeList.add(edge);
    }
    
    /**
     * 指定のindexのEdgeを管理から削除する
     * @param index 削除するindex
     */
    public void remove(int index) {
        this.edgeList.remove(index);
    }
    
    /**
     * 指定のEdgeを管理から削除する
     * @param edge 削除するEdge
     */
    public void remove(Edge edge) {
        this.edgeList.remove(edge);
    }
    
    /**
     * 指定のEdgeを管理しているか否かを返す
     * @param edge Edeg
     * @return 管理に含まれていればtrue
     */
    public boolean isIncludeEdge(Edge edge){
        for(Edge e : this.edgeList) {
            if(e.equals(edge)) {
                return true;
            }
        }
        return false;
    }
    
}
